console.log('↓');

// var math = require("math");
var express = require("express");

/* 
    Buffer(缓冲区)
        结构与数组类似，操作也类似
        数组不能存储二进制文件，而Buffer专门用来存储二进制数据
        Buffer中每个元素的大小范围：00 - ff (0 - 255) 0000,0000 - 1111,1111
        二进制1位0或1：1bit
        buffer中一个元素：1Byte == 1字节
        buffer.length   占用内存大小
        str.length      字符串长度
        buffer的构造函数都是不使用的
        初始化大小后，长度不会改变
 
var str = "hello world";
var buf = Buffer.from(str);  // 将一个字符串转为buffer
// 以二进制存储，以十六进制输出
var buf2 = Buffer.alloc(10);  // 分配空间 初始化数据
buf2[0] = 44;
buf2[1] = 255;
buf2[2] = 0xaa;
buf2[3] = 555; // 超出大小的只保留后8位
buf2[10] = 0xff;

console.log(buf);
console.log(buf.toString());       // 将buffer转为字符串
console.log(buf2,buf2.length);
console.log(buf2[2]);   // 输出十进制
console.log(buf2[2].toString(16));  // 输出十六进制


var buf3 = Buffer.allocUnsafe(10);  // 分配空间 不初始化
console.log(buf3);
*/


/*
    fs：文件系统 通过Node来操作系统中的文件
    fs.close(, , callback())        //异步
    fs.closeSync(, ,)               //同步
*/
var fs = require('fs');
// console.log(fs);
// 文件写入：
//  同步
//      打开文件    openSync(path,flags[,mode])  没有则新建
// path  文件路径   flags  文件操作类型 r：只读 w：可写的   mode  设置文件的操作权限，一般不传
//      返回值：文件标识符 可通过这个标识符来对文件进行操作
/*
var fd = fs.openSync("hello Sync.txt",'w');
console.log(fd);
//      编辑文件    writeSync(fd,string[,position[,encoding]])
// fd 文件标识符    string  要写入的内容    position   写入起始位置     encoding   文件编码
fs.writeSync(fd,'this is node');
//      关闭文件    closeSync(fd)
fs.closeSync(fd);
//  异步  结果都是通过回调函数返回 (err,fd) err 错误对象，若没有错误则为null 
//  回调函数的代码都是最后再执行
fs.open("hello.txt",'w',function(err,fd){
    if(!err){
        console.log(fd);
        fs.write(fd,'this is notsync',function(err){
            if(!err){
                console.log("异步写入成功！");
            }
            fs.close(fd,function(err){
                if(!err){
                    console.log("异步文件已关闭！");
                }
            })
        });
    } else{
        console.log(err);
    }
})
*/

/*  简单文件写入
        fs.writeFile(file,data[,options],callback)
        fs.writeFileSync(file, data[,options])
        file    要操作的文件路径
        data    要写入的数据
        options 选项，可以对写入进行一些设置 一般省略不写 为一个对象
            encoding 文件编码
            mode     指定文件权限
            flag     文件操作类型 r : 只读  w : 可编辑(覆盖)  a : 追加
        callback    对写入完以后执行的函数


 
// C:\Users\Administrator\Desktop
fs.writeFile("C:\\Users\\Administrator\\Desktop\\nodeJs.txt","this is writefile content",{flag:'a+'},function(err){
    if(!err){
        console.log("写入成功");
    } else{
        console.log("写入失败");
    }
})
*/ 
/*
for(var i=0; i<20; i++){
    fs.writeFile("C:\\Users\\Administrator\\Desktop\\nodeJs" + i + ".txt","this is writefile content",{flag:'a+'},function(err){
        if(!err){
            console.log("写入成功");
        } else{
            console.log("写入失败");
        }
    })
}
*/
/*  同步、异步、简单写入 都不适合大文件，性能差，容易造成内存溢出
    流式文件写入    适合大文件
    创建一个可写流  fs.createWriteStream(path,options)
    通过open/close来监听流的打开和关闭

var ws = fs.createWriteStream("hello3.txt");
ws.once("open",function(){
    console.log("open");
});
ws.once("close",function(){
    console.log("close");
});
ws.write("通过可写流");
ws.end();
*/


/*
    文件读取
        简单文件读取
            fs.readFile(path[,options],callback)
                callback(err,data)
            fs.readFileSync(path[,options])

fs.readFile("Eiza.jpg",function(err,data){
    if(!err){
        console.log(data);
        fs.writeFile("new.png",data,function(err){
            if(!err){
                console.log("复制成功");
            }
        })
    }
});
*/

/*
    流式文件读取 适用于大文件 可以将文件多次读取到内存中
    读取可读流中的数据必须要为可读流绑定一个data事件，绑定后，自动开始读取数据

var rs = fs.createReadStream("Eiza.jpg");
rs.once("open",function(){
    console.log('reading');
});
rs.once("close",function(){
    console.log('read closing');
    // ws.end();
});

rs.on("data",function(data){
    //console.log(data.length); // 读取数据一次最大内存为 65536字节 == 64KB
    // ws.write(data);
});

var ws = fs.createWriteStream("new.gif");
ws.once("open",function(){
    console.log('writing');
})
ws.once("close",function(){
    console.log('write closing');
})

// pipe() 可以将可读流中的内容直接输出到可写流中
rs.pipe(ws);
*/
/*
    fs 其它操作
        fs.existsSync(path)  判断路径是否存在
        fs.stat(path,callback)  获取文件状态
        fs.unlink(path,callback)  删除文件
        fs.readdir(path[,options])  读取目录结构
*/
var isExist = fs.existsSync("Eiza.jpg");
console.log(isExist);
fs.stat("Eiza.jpg",function(err,stats){   
    // console.log(stats);
    if(!err){
        console.log(stats.isFile);  //是否是文件
        console.log(stats.isDirectory);  //是否是目录
        console.log(stats.size);    //文件大小
    }
    
});
// fs.unlinkSync("new.png");
fs.readdir(".",function(err,files){
    if(!err){
        // console.log(files);
    }
});
// 截断文件，将文件修改成指定大小
// fs.truncateSync("hello.txt",5);
// 创建一个文件夹
// fs.mkdirSync("hello");
// 删除一个文件夹
// fs.mkdirSync("hello");
// 重命名文件夹  也可实现剪切
/*
fs.renameSync("hello.txt","C:/Users/Administrator/Desktop/hello.txt",function(err){
    if(!err){
        console.log("修改成功！");
    }
})
*/
// 监视文件更改写入
fs.watchFile("hello.txt",{interval:1000},function(curr,prev){
    console.log("current-size: " + curr.size);
    console.log("last-size: " + prev.size);
});

console.log('↑');

